今天要來研究的是 canvas~ 踩下去才發現是一個大坑XD,以下先從最基本的開始認識起,最後再來嘗試畫出自己的視力檢查表
<img>
類似,但沒有src
和alt
屬性,可透過 JS 操作來繪圖width
和 height
,沒有指定大小就會是上述的預設尺寸建立畫布的方式很簡單,就是在 HTML 輸入<canvas>
標籤
<canvas class=".canvas" width="150" height="150"></canvas>
再用操作 DOM 元素方式取得 canvas 元素後,使用getContext
方法取得渲染環境,這個方法接受一個參數來指定是幾維度的繪圖
const canvas = document.querySelector('.canvas'); const ctx = canvas.getContext('2d');
有了基本的設定後就可以來繪製圖型了~
ctx.fillRect(x, y, width, height)
: 繪製填滿的矩形ctx.strokeRect(x, y, width, height)
: 繪製空白矩形ctx.clearRect(x, y, width, height)
: 清除矩形區域透過這些語法和更改線條樣式的語法就可以畫出下面的圖樣
可以用codepen觀察會比較清楚每個方法做到的效果
需要注意的地方是,如果要改變顏色,改變顏色的語法必須在繪製方法前喔!
ctx.arc(x, y, radius, startAngle, endAngle [, counterclockwise])
弧形的語法需要五個參數,x,y
代表圓心在畫布上的位置,根據radius
為半徑畫圓,可以利用startAngle
和 endAngle
指定開始和結束的位置,counterclockwise
是個非必要的參數,接受布林值,預設是 false,代表順時針繪製,true 則為逆時針繪製
MDN 特別註記: arc()方法用的是弧度(radians)而非角度(degrees),如果要在弧度與角度間換算,需要經過轉換,轉換的語法如下
radians = (Math.PI/180)* degrees
圖片來源:HTML5 Canvas Line Tutorial
看著 MDN 示範弧形操作時,聯想到了視力檢查會出現的C型環,於是有了以下的練習,在開始前先認識一下 C 型視力表的設計
C 型視力表,又名蘭氏環形視力表(Landolt C),由瑞士眼科醫生Edmund Landolt 於19世紀發明,主要特色為:
- 有8個開口方向(E字視力表只有四個方向)
- 筆畫粗細以及開口大小是直徑的五分之一
開始練習~
<canvas width="400px" height="600px"></canvas>
function drawC(x, y, lineWidth, gapDirection) {
const ctx = canvas.getContext('2d');
ctx.lineWidth = lineWidth;
const radius = ctx.lineWidth * 2.5;
const gap = 12;
const startAngle = (gapDirection + gap) * (Math.PI/180);
const endAngle = (gapDirection - gap) * (Math.PI/180);
ctx.beginPath();
ctx.arc(x,y,radius,startAngle,endAngle);
ctx.stroke();
}
// 第一排
drawC(100, 80, 20, 180);
drawC(300, 80, 20, 0);
// ...略 (前三排都先直接輸入數值)
// 第四排以後
const rotationDegree = 45;
for (let x = 50; x <= 350; x+= 60) {
const rotationRatio = Math.floor((Math.random() * 9));
const direction = 0 + rotationRatio * rotationDegree;
drawC(x, 320, 4, direction);
}
完成~
每天盯著電腦工作又寫鐵人賽的大家記得要定期檢查視力喔~
參考資料: